package com.example.embed.calcite.func;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

/**
 * 日期时间函数工具类
 * <p>
 * 提供在Calcite SQL查询中使用的日期时间处理函数，
 * 支持日期时间的加减操作等常用功能。
 * </p>
 * 
 * @author zwg
 * @date 2025/7/7 09:51
 */
public class DateTimeFunctions {
    /**
     * 从LocalDateTime中减去指定的时间间隔
     * <p>
     * 这是一个通用的日期时间减法函数，支持多种时间单位，
     * 可以在SQL查询中直接调用，用于日期范围查询等场景。
     * </p>
     * 
     * @param dateTime 原始日期时间
     * @param interval 要减去的时间间隔值
     * @param unit 时间单位(DAY, HOUR, MINUTE, SECOND等)
     * @return 计算后的LocalDateTime对象，如果输入为null则返回null
     */
    public static LocalDateTime dateSub(LocalDateTime dateTime, int interval, String unit) {
        if (dateTime == null || unit == null) {
            return null;
        }

        ChronoUnit chronoUnit = ChronoUnit.valueOf(unit.toUpperCase());
        return dateTime.minus(interval, chronoUnit);
    }

    /**
     * 从LocalDateTime中减去指定的天数
     * <p>
     * 天数减法的便捷方法，专用于减去指定天数。
     * </p>
     * 
     * @param dateTime 原始日期时间
     * @param days 要减去的天数
     * @return 计算后的LocalDateTime对象，如果输入为null则返回null
     */
    public static LocalDateTime dateSubDays(LocalDateTime dateTime, int days) {
        return dateTime != null ? dateTime.minusDays(days) : null;
    }

    /**
     * 从LocalDateTime中减去指定的小时数
     * <p>
     * 小时减法的便捷方法，专用于减去指定小时数。
     * </p>
     * 
     * @param dateTime 原始日期时间
     * @param hours 要减去的小时数
     * @return 计算后的LocalDateTime对象，如果输入为null则返回null
     */
    public static LocalDateTime dateSubHours(LocalDateTime dateTime, int hours) {
        return dateTime != null ? dateTime.minusHours(hours) : null;
    }
}
